Structs এবং Ownership এর নিয়ম

Structures (স্ট্রাকচারস) - রাস্ট (Rust) - Computer Programming

267

Structs (স্ট্রাক্টস)

স্ট্রাক্টস হল একটি ব্যবহারকারী-সংজ্ঞায়িত ডেটা টাইপ যা একাধিক ডেটা ফিল্ড ধারণ করতে পারে। এটি সাধারণত সম্পর্কিত ডেটা একটি ইউনিটের মধ্যে গ্রুপ করার জন্য ব্যবহৃত হয়। স্ট্রাক্টস রাস্টের মধ্যে খুবই শক্তিশালী এবং এটি সাধারণত অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর মতো ধারণা গঠন করতে সাহায্য করে।

স্ট্রাক্টস তৈরি করা:

স্ট্রাক্ট তৈরি করতে struct কীওয়ার্ড ব্যবহার করা হয়।

উদাহরণ:

struct Person {
    name: String,
    age: u32,
}

fn main() {
    // একটি Person স্ট্রাক্ট তৈরি
    let person1 = Person {
        name: String::from("Alice"),
        age: 30,
    };

    println!("Name: {}, Age: {}", person1.name, person1.age);
}

এখানে Person একটি স্ট্রাক্ট যা name এবং age নামে দুটি ফিল্ড ধারণ করছে।

স্ট্রাক্টে ফাংশন যোগ করা:

স্ট্রাক্টে ফাংশন যোগ করতে impl ব্লক ব্যবহার করা হয়, যেখানে স্ট্রাক্টের জন্য ফাংশন বা মেথড সংজ্ঞায়িত করা হয়।

উদাহরণ:

impl Person {
    fn greet(&self) {
        println!("Hello, my name is {}", self.name);
    }
}

fn main() {
    let person1 = Person {
        name: String::from("Bob"),
        age: 25,
    };
    person1.greet();
}

এখানে greet মেথড স্ট্রাক্ট Person এর জন্য তৈরি করা হয়েছে, যা self রেফারেন্স ব্যবহার করে name প্রপার্টি অ্যাক্সেস করে।


Ownership (অনারশিপ)

রাস্টের Ownership মডেলটি মেমোরি ম্যানেজমেন্টকে গ্যারান্টি দেওয়ার জন্য অত্যন্ত গুরুত্বপূর্ণ। এই মডেলটি ownership, borrowing, এবং lifetime এর ধারণার মাধ্যমে পরিচালিত হয় এবং মেমোরি সেফটি নিশ্চিত করে, যেখানে গ্যারবেজ কালেক্টর ছাড়াই মেমোরি ম্যানেজ করা সম্ভব।

Ownership এর তিনটি মূল নিয়ম:

  1. একটি ভেরিয়েবল শুধুমাত্র একটি মালিক থাকতে পারে:
    একটি ভেরিয়েবল যখন একটি মান ধারণ করে, তখন সেই মানের মালিক সেই ভেরিয়েবল। মালিকানা যখন অন্য ভেরিয়েবলে স্থানান্তরিত হয়, তখন আগের ভেরিয়েবল আর সেই মানের মালিক থাকে না।
  2. বোরোউ (Borrowing):
    মালিকানা পরিবর্তন না করে, অন্য ভেরিয়েবল বা ফাংশনকে ডেটা আংশিকভাবে অ্যাক্সেস করার অনুমতি দেওয়া হয়। এটি immutable borrow (শুধু পড়া) এবং mutable borrow (লেখা এবং পড়া) হিসেবে বিভক্ত করা হয়। কিন্তু এক সময়ে শুধুমাত্র একটি mutable borrow থাকতে পারে, বা একাধিক immutable borrow থাকতে পারে, কিন্তু একসাথে দুটি থাকতে পারে না।
  3. মেমোরি রিলিজ:
    যখন মালিক ভেরিয়েবল ড্রপ হয় (scope শেষ হলে), তখন ওই ভেরিয়েবলের মেমোরি স্বয়ংক্রিয়ভাবে মুক্ত হয়ে যায়। এটি গ্যারান্টি দেয় যে, আপনি কখনও মেমোরি লিক বা ডাবল ফ্রি করতে পারবেন না।

Ownership এর উদাহরণ:

উদাহরণ ১: Ownership (মালিকানা স্থানান্তর)

fn main() {
    let s1 = String::from("Hello");  // s1 মালিক
    let s2 = s1;                      // s1 থেকে s2 তে মালিকানা স্থানান্তর

    // println!("{}", s1); // এই লাইনটি কম্পাইল হবে না, কারণ s1 এর মালিকানা s2 তে চলে গেছে।
    println!("{}", s2);   // এটা ঠিক আছে
}

এখানে s1 থেকে s2 তে মালিকানা স্থানান্তরিত হচ্ছে, এবং এর ফলে s1 আর ব্যবহারযোগ্য থাকে না।

উদাহরণ ২: Immutable Borrow (ইমিউটেবল বোরোউ)

fn main() {
    let s1 = String::from("Hello");
    let s2 = &s1; // s1 এর immutable borrow

    println!("{}", s1);  // এটা ঠিক আছে, কারণ s2 শুধুমাত্র পড়ছে
    println!("{}", s2);
}

এখানে s2 s1 থেকে একটি immutable borrow নিয়েছে, তাই s1 এখনো ব্যবহৃত হতে পারে।

উদাহরণ ৩: Mutable Borrow (মিউটেবল বোরোউ)

fn main() {
    let mut s1 = String::from("Hello");
    let s2 = &mut s1;  // mutable borrow

    s1.push_str(", World!");  // কম্পাইল হবে না, কারণ s1 এর mutable borrow করা হয়েছে

    println!("{}", s2);  // এটি কম্পাইল হবে না, কারণ s1 এখন mutable borrowed রয়েছে
}

এখানে s1 এর mutable borrow করা হয়েছে, ফলে অন্য কোনো mutable বা immutable borrow করা যাবে না।


Ownership এবং Structs

স্ট্রাক্টসেও Ownership এর নিয়মগুলো কার্যকরী। যখন একটি স্ট্রাক্টে ডেটা স্থানান্তর করা হয়, তখন তার ফিল্ডগুলোও মালিকানা স্থানান্তরিত হয়।

উদাহরণ:

struct Person {
    name: String,
    age: u32,
}

fn main() {
    let person1 = Person {
        name: String::from("Alice"),
        age: 30,
    };

    let person2 = person1;  // person1 থেকে person2 তে মালিকানা স্থানান্তরিত

    // println!("{}", person1.name);  // এই লাইনটি কম্পাইল হবে না, কারণ person1 এর মালিকানা person2 তে চলে গেছে
    println!("{}", person2.name);  // ঠিক আছে
}

এখানে person1 থেকে person2 তে মালিকানা স্থানান্তরিত হয়ে গেছে, এবং person1 এখন আর ব্যবহৃত হতে পারে না।


সারাংশ

  • Structs একটি ব্যবহারকারী-সংজ্ঞায়িত ডেটা টাইপ যা একাধিক মান বা ফিল্ড ধারণ করে।
  • Ownership একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা মেমোরি সেফটি নিশ্চিত করে, যেখানে এক সময় একটি ডেটার শুধুমাত্র একটি মালিক থাকে।
  • মালিকানা স্থানান্তরিত হলে আগের মালিক আর ডেটা অ্যাক্সেস করতে পারে না।
  • Borrowing পদ্ধতি মালিকানা পরিবর্তন না করেই ডেটা শেয়ার করতে সহায়তা করে, তবে একসাথে একাধিক mutable borrow হতে পারে না।
  • মালিকানা নিয়ম অনুসারে, স্ট্রাক্টসের ক্ষেত্রেও মালিকানা স্থানান্তরিত হয়।
Content added By
Promotion

Are you sure to start over?

Loading...